package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import org.springframework.stereotype.Service;

import com.thoughtworks.xstream.XStream;

import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOEmpresa;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.ResultadoValidacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.Servicio;
 
@Service
public class ServicioEmpresaImpl implements IServicioEmpresa, Serializable {
 
	private static final long serialVersionUID = 5607203552383299997L;
	
	@Inject
    private IDAOEmpresa daoEmpresa;

	@Override
    public Collection<Empresa> listarEmpresasActivas() throws ServiceException{
        try {
            return daoEmpresa.listarActivos(Empresa.class);
        } catch (DAOException ex) {
        	Logger.getLogger(ServicioEmpresaImpl.class.getName()).log(Level.SEVERE, null, ex);
        	throw new ServiceException(ex.getMessage(), ex);
        } 
    }

    @Override
    public Collection<Empresa> listarTodasEmpresas() throws ServiceException{
        try {
            return daoEmpresa.listarTodos(Empresa.class);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioEmpresaImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public void guardarEmpresa(Empresa empresa) throws ServiceException {
        try {
            empresa.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            empresa.setEstadoEmpresa(Empresa.ESTADO_EMPRESA.ACTIVA.getValor());
            XStream stream =  new XStream();
            System.out.println(stream.toXML(empresa));
            daoEmpresa.insertar(empresa);
        } catch (DAOException ex) {
        	throw new ServiceException(ex);
        }
    }

    @Override
    public Empresa conseguirEmpresaPorId(Integer idEmpresa) throws ServiceException{
        try {
            return daoEmpresa.obtenerEntidadPorId(Empresa.class, idEmpresa);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioEmpresaImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public ResultadoServicio actualizarEmpresa(Empresa empresa) throws ServiceException{
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            daoEmpresa.actualizar(empresa);
        } catch (DAOException ex) {
            ex.printStackTrace();
            Logger.getLogger(ServicioEmpresaImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public Collection<Empresa> listarServiciosPorFiltro(Empresa empresa) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            if (empresa.getRuc() != null) {
                
                System.out.println("prueba de entrada 1");                    
                parametro.put("ruc", empresa.getRuc());
            }
            if (empresa.getRazonSocial() != null) {
                
                System.out.println("prueba de entrada 2"); 
                parametro.put("razonSocial", empresa.getRazonSocial());
            }
            if (empresa.getNombreComercial() != null) {
                
                System.out.println("prueba de entrada 3"); 
                parametro.put("nombreComercial", empresa.getNombreComercial());
            }
            
            System.out.println("prueba de entrada 2"); 
            parametro.put("estadoRegistro", ""+ESTADO_REGISTRO.ACTIVO.getValor());
            return daoEmpresa.obtenerColeccionEntidadPorFiltros(Empresa.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Empresa conseguirEmpresaConUbigeo(Integer idEmpresa) throws ServiceException{
        try {
            return daoEmpresa.obtenerEntidadConUbigeo( idEmpresa);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioEmpresaImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public boolean validarRuc(String ruc) throws ServiceException{
        try {
            if(daoEmpresa.validarRuc(ruc)==null)
                return true;
            else return false;
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public boolean validarRazonSocial(String razonSocial) throws ServiceException{
        try {
            if(daoEmpresa.validarRazonSocial(razonSocial)==null)
                return true;
            else return false;
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
    
    @Override
    public Empresa buscarEmpresaPorRS(String razonSocial) throws ServiceException{
        try {
            return daoEmpresa.validarRazonSocial(razonSocial);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
    
    
    @Override
    public List<Empresa> obtenerListaEmpresasPorUsuario(Integer idUsuario)
    		throws ServiceException {
    	try{
    		return daoEmpresa.obtenerListaEmpresasPorUsuario(idUsuario);
    	}catch(Exception ex){
    		throw new ServiceException(ex.getMessage(), ex);
    	}
    }
    
    
}
